package com.mxz.common.core.utils.thread;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程工具类
 *
 * @author mxz
 */
public class FixedThreadPool {

    // 获取服务器的cpu个数
    private static final Integer cpuNum = Runtime.getRuntime().availableProcessors();
    // 初始化线程池-业务密集型设置线程数为‘cpu核数+1’-io密集型设置为‘cup核数*2+1’
    private static final ExecutorService threadPool = new ThreadPoolExecutor(cpuNum + 1, cpuNum + 1,
            0L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<Runnable>());

    /**
     * 加入线程对象
     *
     * @param run
     */
    public static void pushThread(Runnable run) {
        threadPool.execute(run);
    }

    /**
     * 加入线程集合对象
     *
     * @param runs
     */
    public static void pushThread(List<Runnable> runs) {
        for (Runnable run : runs) {
            threadPool.execute(run);
        }
    }

    /**
     * 加入线程数组对象
     *
     * @param run
     */
    public static void pushThread(Runnable[] run) {
        for (int i = 0; i < run.length; i++) {
            threadPool.execute(run[i]);
        }
    }

    /**
     * 启动一次顺序关闭，执行以前提交的任务，但不接受新任务。
     */
    public static void shutDownThread() {
        threadPool.shutdown();
    }

    /**
     * 试图停止所有正在执行的活动任务，暂停处理正在等待的任务，并返回等待执行的任务列表。
     *
     * @return
     */
    public static List<Runnable> shutDownThreadAndReturnRuns() {
        return threadPool.shutdownNow();
    }

    /**
     * 请求关闭、发生超时或者当前线程中断，无论哪一个首先发生之后，都将导致阻塞，直到所有任务完成执行。
     *
     * @param timeout
     * @param unit
     */
    public static void awaitTermination(Long timeout, TimeUnit unit) {
        boolean b;
        try {
            b = threadPool.awaitTermination(timeout, unit);
            System.out.println("等待完毕");
            if (b) {
                System.out.println("分线程已经结束");
            }
            System.out.println(Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
